package 单例模式;

public class 懒汉模式 {
    //懒汉模式 通过getInstance() 方法来获取实例，首次调用该方法时才真正创建实例，这就是 懒加载/延时加载
    static class Singelton {
        private static volatile Singelton instance=null;
        //volatile在这里是非常必要的，它保证了内存可见性，
        //防止后面的if判断instance是否为空时从寄存器中读instance，确保从内存中读instance

        public static Singelton getInstance() {
            if (instance==null) {
                //上面的if 避免了必须后续的加锁
                synchronized (Singelton.class) {
                    //加锁要将 if判断和赋值都进行包裹
                    if (instance==null) {
                        instance=new Singelton();
                    }
                }
            }
            return instance;
        }
        //将构造方法设为 private，防止在类外调用构造方法，禁止调用者在其他地方创建实例的机会
        private Singelton() {}
    }

    public static void main(String[] args) {
        //通过 懒汉模式获取到Singleton的实例，这样的实例是唯一的
        Singelton instance = Singelton.getInstance();
    }
}
